package jtrade.io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.NavigableMap; import java.util.TreeMap; import java.util.zip.GZIPInputStream; import jtrade.Symbol; import jtrade.SymbolFactory; import jtrade.marketfeed.Bar; import jtrade.util.Util; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.Duration; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class CsvBarFileReader extends BufferedReader implements BarReader { Symbol symbol; Duration barSize; DateTimeZone tz; DateTimeFormatter dateFormatter; String[] tmp; public CsvBarFileReader(File file) throws IOException { super(file.getPath().endsWith(".gz") ? new InputStreamReader(new GZIPInputStream(new FileInputStream(file), 8192)) : new FileReader(file)); tmp = new String[8]; readHeader(); } private void readHeader() throws IOException { tz = DateTimeZone.getDefault(); dateFormatter = DateTimeFormat.forPattern("yyyyMMdd HH:mm:ss"); String line = null; while ((line = readLine()) != null) { if (line.startsWith("# symbol")) { symbol = SymbolFactory.getSymbol(line.substring(9).trim()); continue; } if (line.startsWith("# barSizeSeconds")) { barSize = Duration.standardSeconds(Integer.parseInt(line.substring(17).trim())); continue; } if (line.startsWith("# timeZone")) { tz = DateTimeZone.forID(line.substring(11).trim()); dateFormatter = dateFormatter.withZone(tz); continue; } if (line.startsWith("# dateFormat")) { dateFormatter = DateTimeFormat.forPattern(line.substring(13).trim()).withZone(tz); continue; } if (line.startsWith("#")) { continue; } if (line.startsWith("date,")) { return; } } } @Override public Bar readBar() throws IOException { String line = readLine(); if (line == null) { return null; } String[] values = Util.split(line, ',', tmp); Bar bar = new Bar(barSize, symbol, dateFormatter.parseDateTime(values[0]), Double.parseDouble(values[1]), Double.parseDouble(values[2]), Double.parseDouble(values[3]), Double.parseDouble(values[4]), Double.parseDouble(values[7]), Long.parseLong(values[5]), Integer.parseInt(values[6])); return bar; } @Override public NavigableMap<DateTime, Bar> readBars() throws IOException { try { NavigableMap<DateTime, Bar> bars = new TreeMap<DateTime, Bar>(); Bar bar = null; while ((bar = readBar()) != null) { bars.put(bar.getDateTime(), bar); } return bars; } finally { try { close(); } catch (IOException e) { } } } }